package com.newly.center.sys.service.tenant.api;

import com.newly.common.base.constants.AuthConstant;
import com.newly.common.base.entity.PageUtils;
import com.newly.common.base.entity.auth.ICurrentTenant;
import com.newly.common.base.entity.sys.tenant.bo.SimpleTenantBo;
import com.newly.common.base.entity.sys.tenant.dto.*;
import com.newly.common.base.entity.sys.tenant.po.TenantPo;
import com.newly.common.base.entity.sys.tenant.vo.UpdTenantVo;
import com.newly.common.base.entity.sys.tenant.vo.TenantVo;

import java.util.List;
import java.util.Map;

/**
 * @author gjm guan
 * @date 2021/8/19 17:18
 * @desc 用户业务接口
 */
public interface ITenantService {
    /**
     * 创建租户
     *
     * @param tenantDto 租户信息
     * @return 创建成功返回true
     */
    boolean save(TenantDto tenantDto);

    /**
     * 通过id删除租户，权限限制
     *
     * @param tenantIds 租户id
     * @return 删除成功返回true
     */
    boolean removeByIdsInAuth(List<Long> tenantIds);

    /**
     * 通过id删除租户，权限限制
     *
     * @param tenantId 租户id
     * @return 删除成功返回true
     */
    boolean removeByIdInAuth(Long tenantId);

    /**
     * 通过id删除租户，权限限制
     *
     * @param tenantIds 租户id
     * @return 删除成功返回true
     */
    boolean removeByIds(List<Long> tenantIds);

    /**
     * 通过id删除租户，权限限制
     *
     * @param tenantId 租户id
     * @return 删除成功返回true
     */
    boolean removeById(Long tenantId);

    /**
     * 通过id获取租户精简数据,先从redis中获取，redis中获取不到再从数据库中获取
     *
     * @param tenantId 租户id
     * @return SimpleTenantVo.class
     */
    SimpleTenantBo getSimpleTenant(Long tenantId);

    /**
     * 通过id查询租户
     *
     * @param tenantIds 租户id
     * @return List TenantPo.class
     */
    List<TenantPo> getByIds(List<Long> tenantIds);

    /**
     * 通过id查询租户
     *
     * @param tenantId 租户id
     * @return TenantPo.class
     */
    TenantPo getById(Long tenantId);

    /**
     * 获取登录租户，通过用户名和用户类型获取
     *
     * @param username 用户名
     * @param type     租户类型
     * @return TenantPo.class
     */
    TenantPo getLoginTenant(String username, AuthConstant.UserType type);

    /**
     * 获取当前租户信息
     *
     * @return TenantPo.class
     */
    TenantPo getCurrentTenant();

    /**
     * 查询当前租户的子租户列表，分页带多条件
     *
     * @param offset   页码
     * @param limit    页数
     * @param domainId 区域
     * @param fromTime 创建开始时间
     * @param toTime   创建结束时间
     * @param keyword  关键字
     * @return PageUtils List TenantPo.class
     */
    PageUtils listInAuth(Integer offset, Integer limit, Integer domainId, String fromTime,
                         String toTime, String keyword);

    /**
     * 创建租户。
     * 为该用户指定一个角色并赋予系统采集角色（标准权限角色，采集数据需要）
     * 如果当前租户不具备赋予的角色权限则添加用户失败。
     *
     * @param tenantDto 新租户数据
     * @return 添加成功返回true
     */
    boolean save(CreateTenantDto tenantDto);

    /**
     * 删除租户
     * 先校验当前租户是不是被删除租户的父级，如果不是不予许删除
     * 根据当前租户的角色和被删除的租户的角色对比，被删除的角色必须是当前角色的子级
     *
     * @param tenantIds   将被删除的租户id
     * @return 删除成功返回true
     */
    boolean removeTenant(List<Long> tenantIds);

    /**
     * 逻辑删除用户
     *
     * @param tenantIds
     * @return
     */
    boolean logicDel(List<Long> tenantIds);

    /**
     * 查询租户，支持分页带关键字。只查询当前租户下的子租户，也就是当前租户api角色的子角色
     *
     * @param currentUser 当前租户
     * @param offset      页码
     * @param limit       页数
     * @param keyword     关键字
     * @return PageUtils.class
     */
    PageUtils listTenant(ICurrentTenant currentUser, Integer offset, Integer limit, String keyword);

    /**
     * 解析currentUser对象获取当前租户数据
     *
     * @param currentUser 当前租户
     * @return TenantVo.class
     */
    TenantVo parseCurrentTenant(ICurrentTenant currentUser);

    /**
     * 通过角色id获取租户
     *
     * @param roleIds 角色id
     * @return list TenantPo.class
     */
    List<TenantPo> getTenantByRoleIds(List<Integer> roleIds);

    /**
     * 通过租户id获取租户
     *
     * @param tenantIds 租户id
     * @return List TenantPo.class
     */
    List<TenantPo> getTenantByIds(List<Long> tenantIds);

    /**
     * 根据id查询租户
     *
     * @param tenantId
     * @return
     */
    UpdTenantVo queryTenantById(Long tenantId);

    /**
     * 通过tenantId获取租户，先尝试从tenantPoMap获取，
     * tenantPoMap获取不到再从数据库中获取
     *
     * @param tenantId    租户id
     * @param tenantPoMap 缓存租户的map
     * @return TenantPo.class
     */
    TenantPo getTenantInMapCache(Long tenantId, Map<Long, TenantPo> tenantPoMap);

    /**
     * 获取所有用户名称
     *
     * @param
     * @return
     */
    List<String> getUserNames();

    /**
     * 查询用户名称是否已存在
     *
     * @param userName
     * @return
     */
    boolean repeat(String userName);

    /**
     * 查询邮箱是否已存在
     *
     * @param email
     * @return
     */
    List<TenantPo> repeatEmail(String email);

    /**
     * 修改租户信息
     *
     * @param updTenantDto
     * @return
     */
    boolean updTenant(UpdTenantDto updTenantDto);

    /**
     * 修改密码
     *
     * @param updPasswordDto
     * @return
     */
    boolean updPassword(UpdPasswordDto updPasswordDto);

    /**
     * 通过邮箱修改密码
     *
     * @param updPasswordDto
     * @return
     */
    boolean updPasswordByEmail(UpdPasswordByEmailDto dto);
}
